<?php
/**
 * Smarty Internal Plugin Templatelexer
 *
 * This is the lexer to break the template source into tokens
 * @package Smarty
 * @subpackage Compiler
 * @author Uwe Tews
 */
/**
 * Smarty Internal Plugin Templatelexer
 */
class Smarty_Internal_Templatelexer
{
    public $data;
    public $counter;
    public $token;
    public $value;
    public $node;
    public $line;
    public $taglineno;
    public $state = 1;
    public $strip = false;
    private $heredoc_id_stack = Array();
    public $smarty_token_names = array( // Text for parser error messages
        'IDENTITY' => '===',
        'NONEIDENTITY' => '!==',
        'EQUALS' => '==',
        'NOTEQUALS' => '!=',
        'GREATEREQUAL' => '(>=,ge)',
        'LESSEQUAL' => '(<=,le)',
        'GREATERTHAN' => '(>,gt)',
        'LESSTHAN' => '(<,lt)',
        'MOD' => '(%,mod)',
        'NOT' => '(!,not)',
        'LAND' => '(&&,and)',
        'LOR' => '(||,or)',
        'LXOR' => 'xor',
        'OPENP' => '(',
        'CLOSEP' => ')',
        'OPENB' => '[',
        'CLOSEB' => ']',
        'PTR' => '->',
        'APTR' => '=>',
        'EQUAL' => '=',
        'NUMBER' => 'number',
        'UNIMATH' => '+" , "-',
        'MATH' => '*" , "/" , "%',
        'INCDEC' => '++" , "--',
        'SPACE' => ' ',
        'DOLLAR' => '$',
        'SEMICOLON' => ';',
        'COLON' => ':',
        'DOUBLECOLON' => '::',
        'AT' => '@',
        'HATCH' => '#',
        'QUOTE' => '"',
        'BACKTICK' => '`',
        'VERT' => '|',
        'DOT' => '.',
        'COMMA' => '","',
        'ANDSYM' => '"&"',
        'QMARK' => '"?"',
        'ID' => 'identifier',
        'OTHER' => 'text',
        'LINEBREAK' => 'newline',
        'FAKEPHPSTARTTAG' => 'Fake PHP start tag',
        'PHPSTARTTAG' => 'PHP start tag',
        'PHPENDTAG' => 'PHP end tag',
        'LITERALSTART' => 'Literal start',
        'LITERALEND' => 'Literal end',
        'LDELSLASH' => 'closing tag',
        'COMMENT' => 'comment',
        'LITERALEND' => 'literal close',
        'AS' => 'as',
        'TO' => 'to',
    );


    function __construct($data, $compiler)
    {
        //        $this->data = preg_replace("/(\r\n|\r|\n)/", "\n", $data);
        $this->data = $data;
        $this->counter = 0;
        $this->line = 1;
        $this->smarty = $compiler->smarty;
        $this->compiler = $compiler;
        $this->ldel = preg_quote($this->smarty->left_delimiter, '/');
        $this->ldel_length = strlen($this->smarty->left_delimiter);
        $this->rdel = preg_quote($this->smarty->right_delimiter, '/');
        $this->smarty_token_names['LDEL'] = $this->smarty->left_delimiter;
        $this->smarty_token_names['RDEL'] = $this->smarty->right_delimiter;
    }


    private $_yy_state = 1;
    private $_yy_stack = array();

    function yylex()
    {
        return $this->{
        'yylex' . $this->_yy_state
        }();
    }

    function yypushstate($state)
    {
        array_push($this->_yy_stack, $this->_yy_state);
        $this->_yy_state = $state;
    }

    function yypopstate()
    {
        $this->_yy_state = array_pop($this->_yy_stack);
    }

    function yybegin($state)
    {
        $this->_yy_state = $state;
    }


    function yylex1()
    {
        $tokenMap = array(
            1 => 0,
            2 => 0,
            3 => 1,
            5 => 0,
            6 => 0,
            7 => 0,
            8 => 0,
            9 => 0,
            10 => 0,
            11 => 0,
            12 => 1,
            14 => 0,
            15 => 0,
            16 => 0,
            17 => 0,
            18 => 0,
            19 => 0,
            20 => 0,
            21 => 0,
            22 => 0,
            23 => 2,
            26 => 0,
            27 => 0,
        );
        if ($this->counter >= strlen($this->data)) {
            return false; // end of input
        }
        $yy_global_pattern = "/^(" . $this->ldel . "[$]smarty\\.block\\.child" . $this->rdel . ")|^(\\{\\})|^(" . $this->ldel . "\\*([\S\s]*?)\\*" . $this->rdel . ")|^([\t ]*[\r\n]+[\t ]*)|^(" . $this->ldel . "strip" . $this->rdel . ")|^(" . $this->ldel . "\\s{1,}strip\\s{1,}" . $this->rdel . ")|^(" . $this->ldel . "\/strip" . $this->rdel . ")|^(" . $this->ldel . "\\s{1,}\/strip\\s{1,}" . $this->rdel . ")|^(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|^(" . $this->ldel . "\\s{1,}\/)|^(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|^(" . $this->ldel . "\\s*for\\s+)|^(" . $this->ldel . "\\s*foreach(?![^\s]))|^(" . $this->ldel . "\\s{1,})|^(" . $this->ldel . "\/)|^(" . $this->ldel . ")|^(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|^(\\?>)|^(<%)|^(%>)|^(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|" . $this->ldel . "|<\\?|\\?>|<%|%>)))|^([\S\s]+)|^(.)/iS";

        do {
            if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) {
                $yysubmatches = $yymatches;
                $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
                if (!count($yymatches)) {
                    throw new Exception('Error: lexing failed because a rule matched' .
                                        'an empty string.  Input "' . substr($this->data,
                                                                             $this->counter, 5) . '... state TEXT');
                }
                next($yymatches); // skip jGlobal match
                $this->token = key($yymatches); // token number
                if ($tokenMap[$this->token]) {
                    // extract sub-patterns for passing to lex function
                    $yysubmatches = array_slice($yysubmatches, $this->token + 1,
                                                $tokenMap[$this->token]);
                } else {
                    $yysubmatches = array();
                }
                $this->value = current($yymatches); // token value
                $r = $this->{
                'yy_r1_' . $this->token
                }($yysubmatches);
                if ($r === null) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    // accept this token
                    return true;
                } elseif ($r === true) {
                    // we have changed state
                    // process this token in the new state
                    return $this->yylex();
                } elseif ($r === false) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    if ($this->counter >= strlen($this->data)) {
                        return false; // end of input
                    }
                    // skip this token
                    continue;
                }
            } else {
                throw new Exception('Unexpected input at line' . $this->line .
                                    ': ' . $this->data[$this->counter]);
            }
            break;
        } while (true);

    } // end function


    const TEXT = 1;

    function yy_r1_1($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_SMARTYBLOCKCHILD;
    }

    function yy_r1_2($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

    function yy_r1_3($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_COMMENT;
    }

    function yy_r1_5($yy_subpatterns)
    {

        if ($this->strip) {
            return false;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LINEBREAK;
        }
    }

    function yy_r1_6($yy_subpatterns)
    {

        $this->strip = true;
        return false;
    }

    function yy_r1_7($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->strip = true;
            return false;
        }
    }

    function yy_r1_8($yy_subpatterns)
    {

        $this->strip = false;
        return false;
    }

    function yy_r1_9($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->strip = false;
            return false;
        }
    }

    function yy_r1_10($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
        $this->yypushstate(self::LITERAL);
    }

    function yy_r1_11($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r1_12($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r1_14($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r1_15($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r1_16($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDEL;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r1_17($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r1_18($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LDEL;
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r1_19($yy_subpatterns)
    {

        if (in_array($this->value, Array('<?', '<?=', '<?php'))) {
            $this->token = Smarty_Internal_Templateparser::TP_PHPSTARTTAG;
        } elseif ($this->value == '<?xml') {
            $this->token = Smarty_Internal_Templateparser::TP_XMLTAG;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_FAKEPHPSTARTTAG;
            $this->value = substr($this->value, 0, 2);
        }
    }

    function yy_r1_20($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG;
    }

    function yy_r1_21($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
    }

    function yy_r1_22($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
    }

    function yy_r1_23($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

    function yy_r1_26($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

    function yy_r1_27($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }


    function yylex2()
    {
        $tokenMap = array(
            1 => 0,
            2 => 0,
            3 => 1,
            5 => 0,
            6 => 0,
            7 => 0,
            8 => 0,
            9 => 0,
            10 => 0,
            11 => 0,
            12 => 0,
            13 => 0,
            14 => 0,
            15 => 0,
            16 => 0,
            17 => 0,
            18 => 0,
            19 => 0,
            20 => 1,
            22 => 1,
            24 => 1,
            26 => 0,
            27 => 0,
            28 => 0,
            29 => 0,
            30 => 0,
            31 => 0,
            32 => 0,
            33 => 0,
            34 => 0,
            35 => 0,
            36 => 0,
            37 => 0,
            38 => 0,
            39 => 0,
            40 => 0,
            41 => 0,
            42 => 0,
            43 => 3,
            47 => 0,
            48 => 0,
            49 => 0,
            50 => 0,
            51 => 0,
            52 => 0,
            53 => 0,
            54 => 0,
            55 => 1,
            57 => 1,
            59 => 0,
            60 => 0,
            61 => 0,
            62 => 0,
            63 => 0,
            64 => 0,
            65 => 0,
            66 => 0,
            67 => 0,
            68 => 0,
            69 => 0,
            70 => 0,
            71 => 0,
            72 => 0,
            73 => 0,
            74 => 0,
            75 => 0,
            76 => 0,
        );
        if ($this->counter >= strlen($this->data)) {
            return false; // end of input
        }
        $yy_global_pattern = "/^('[^'\\\\]*(?:\\\\.[^'\\\\]*)*')|^(" . $this->ldel . "\\s{1,}\/)|^(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|^(" . $this->ldel . "\\s*for\\s+)|^(" . $this->ldel . "\\s*foreach(?![^\s]))|^(" . $this->ldel . "\\s{1,})|^(\\s{1,}" . $this->rdel . ")|^(" . $this->ldel . "\/)|^(" . $this->ldel . ")|^(" . $this->rdel . ")|^(\\s+is\\s+in\\s+)|^(\\s+as\\s+)|^(\\s+to\\s+)|^(\\s+step\\s+)|^(\\s+instanceof\\s+)|^(\\s*===\\s*)|^(\\s*!==\\s*)|^(\\s*==\\s*|\\s+eq\\s+)|^(\\s*!=\\s*|\\s*<>\\s*|\\s+(ne|neq)\\s+)|^(\\s*>=\\s*|\\s+(ge|gte)\\s+)|^(\\s*<=\\s*|\\s+(le|lte)\\s+)|^(\\s*>\\s*|\\s+gt\\s+)|^(\\s*<\\s*|\\s+lt\\s+)|^(\\s+mod\\s+)|^(!\\s*|not\\s+)|^(\\s*&&\\s*|\\s*and\\s+)|^(\\s*\\|\\|\\s*|\\s*or\\s+)|^(\\s*xor\\s+)|^(\\s+is\\s+odd\\s+by\\s+)|^(\\s+is\\s+not\\s+odd\\s+by\\s+)|^(\\s+is\\s+odd)|^(\\s+is\\s+not\\s+odd)|^(\\s+is\\s+even\\s+by\\s+)|^(\\s+is\\s+not\\s+even\\s+by\\s+)|^(\\s+is\\s+even)|^(\\s+is\\s+not\\s+even)|^(\\s+is\\s+div\\s+by\\s+)|^(\\s+is\\s+not\\s+div\\s+by\\s+)|^(\\((int(eger)?|bool(ean)?|float|double|real|string|binary|array|object)\\)\\s*)|^(\\(\\s*)|^(\\s*\\))|^(\\[\\s*)|^(\\s*\\])|^(\\s*->\\s*)|^(\\s*=>\\s*)|^(\\s*=\\s*)|^(\\+\\+|--)|^(\\s*(\\+|-)\\s*)|^(\\s*(\\*|\/|%)\\s*)|^(\\$)|^(\\s*;)|^(::)|^(\\s*:\\s*)|^(@)|^(#)|^(\")|^(`)|^(\\|)|^(\\.)|^(\\s*,\\s*)|^(\\s*&\\s*)|^(\\s*\\?\\s*)|^(0[xX][0-9a-fA-F]+)|^([0-9]*[a-zA-Z_]\\w*)|^(\\d+)|^(\\s+)|^(.)/iS";

        do {
            if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) {
                $yysubmatches = $yymatches;
                $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
                if (!count($yymatches)) {
                    throw new Exception('Error: lexing failed because a rule matched' .
                                        'an empty string.  Input "' . substr($this->data,
                                                                             $this->counter, 5) . '... state SMARTY');
                }
                next($yymatches); // skip jGlobal match
                $this->token = key($yymatches); // token number
                if ($tokenMap[$this->token]) {
                    // extract sub-patterns for passing to lex function
                    $yysubmatches = array_slice($yysubmatches, $this->token + 1,
                                                $tokenMap[$this->token]);
                } else {
                    $yysubmatches = array();
                }
                $this->value = current($yymatches); // token value
                $r = $this->{
                'yy_r2_' . $this->token
                }($yysubmatches);
                if ($r === null) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    // accept this token
                    return true;
                } elseif ($r === true) {
                    // we have changed state
                    // process this token in the new state
                    return $this->yylex();
                } elseif ($r === false) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    if ($this->counter >= strlen($this->data)) {
                        return false; // end of input
                    }
                    // skip this token
                    continue;
                }
            } else {
                throw new Exception('Unexpected input at line' . $this->line .
                                    ': ' . $this->data[$this->counter]);
            }
            break;
        } while (true);

    } // end function


    const SMARTY = 2;

    function yy_r2_1($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_SINGLEQUOTESTRING;
    }

    function yy_r2_2($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r2_3($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r2_5($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r2_6($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r2_7($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDEL;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r2_8($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_RDEL;
        $this->yypopstate();
    }

    function yy_r2_9($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r2_10($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LDEL;
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r2_11($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_RDEL;
        $this->yypopstate();
    }

    function yy_r2_12($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISIN;
    }

    function yy_r2_13($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_AS;
    }

    function yy_r2_14($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_TO;
    }

    function yy_r2_15($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_STEP;
    }

    function yy_r2_16($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_INSTANCEOF;
    }

    function yy_r2_17($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_IDENTITY;
    }

    function yy_r2_18($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_NONEIDENTITY;
    }

    function yy_r2_19($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_EQUALS;
    }

    function yy_r2_20($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_NOTEQUALS;
    }

    function yy_r2_22($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_GREATEREQUAL;
    }

    function yy_r2_24($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LESSEQUAL;
    }

    function yy_r2_26($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_GREATERTHAN;
    }

    function yy_r2_27($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LESSTHAN;
    }

    function yy_r2_28($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_MOD;
    }

    function yy_r2_29($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_NOT;
    }

    function yy_r2_30($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LAND;
    }

    function yy_r2_31($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LOR;
    }

    function yy_r2_32($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LXOR;
    }

    function yy_r2_33($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISODDBY;
    }

    function yy_r2_34($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISNOTODDBY;
    }

    function yy_r2_35($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISODD;
    }

    function yy_r2_36($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISNOTODD;
    }

    function yy_r2_37($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISEVENBY;
    }

    function yy_r2_38($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISNOTEVENBY;
    }

    function yy_r2_39($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISEVEN;
    }

    function yy_r2_40($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISNOTEVEN;
    }

    function yy_r2_41($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISDIVBY;
    }

    function yy_r2_42($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ISNOTDIVBY;
    }

    function yy_r2_43($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_TYPECAST;
    }

    function yy_r2_47($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OPENP;
    }

    function yy_r2_48($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_CLOSEP;
    }

    function yy_r2_49($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OPENB;
    }

    function yy_r2_50($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_CLOSEB;
    }

    function yy_r2_51($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_PTR;
    }

    function yy_r2_52($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_APTR;
    }

    function yy_r2_53($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_EQUAL;
    }

    function yy_r2_54($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_INCDEC;
    }

    function yy_r2_55($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_UNIMATH;
    }

    function yy_r2_57($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_MATH;
    }

    function yy_r2_59($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_DOLLAR;
    }

    function yy_r2_60($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_SEMICOLON;
    }

    function yy_r2_61($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_DOUBLECOLON;
    }

    function yy_r2_62($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_COLON;
    }

    function yy_r2_63($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_AT;
    }

    function yy_r2_64($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_HATCH;
    }

    function yy_r2_65($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
        $this->yypushstate(self::DOUBLEQUOTEDSTRING);
    }

    function yy_r2_66($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
        $this->yypopstate();
    }

    function yy_r2_67($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_VERT;
    }

    function yy_r2_68($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_DOT;
    }

    function yy_r2_69($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_COMMA;
    }

    function yy_r2_70($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ANDSYM;
    }

    function yy_r2_71($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_QMARK;
    }

    function yy_r2_72($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_HEX;
    }

    function yy_r2_73($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ID;
    }

    function yy_r2_74($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_INTEGER;
    }

    function yy_r2_75($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_SPACE;
    }

    function yy_r2_76($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }


    function yylex3()
    {
        $tokenMap = array(
            1 => 0,
            2 => 0,
            3 => 0,
            4 => 0,
            5 => 0,
            6 => 0,
            7 => 0,
            8 => 2,
            11 => 0,
        );
        if ($this->counter >= strlen($this->data)) {
            return false; // end of input
        }
        $yy_global_pattern = "/^(" . $this->ldel . "\\s*literal\\s*" . $this->rdel . ")|^(" . $this->ldel . "\\s*\/literal\\s*" . $this->rdel . ")|^([\t ]*[\r\n]+[\t ]*)|^(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|^(\\?>)|^(<%)|^(%>)|^(([\S\s]*?)(?=([\t ]*[\r\n]+[\t ]*|" . $this->ldel . "\/?literal" . $this->rdel . "|<\\?|<%)))|^(.)/iS";

        do {
            if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) {
                $yysubmatches = $yymatches;
                $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
                if (!count($yymatches)) {
                    throw new Exception('Error: lexing failed because a rule matched' .
                                        'an empty string.  Input "' . substr($this->data,
                                                                             $this->counter, 5) . '... state LITERAL');
                }
                next($yymatches); // skip jGlobal match
                $this->token = key($yymatches); // token number
                if ($tokenMap[$this->token]) {
                    // extract sub-patterns for passing to lex function
                    $yysubmatches = array_slice($yysubmatches, $this->token + 1,
                                                $tokenMap[$this->token]);
                } else {
                    $yysubmatches = array();
                }
                $this->value = current($yymatches); // token value
                $r = $this->{
                'yy_r3_' . $this->token
                }($yysubmatches);
                if ($r === null) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    // accept this token
                    return true;
                } elseif ($r === true) {
                    // we have changed state
                    // process this token in the new state
                    return $this->yylex();
                } elseif ($r === false) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    if ($this->counter >= strlen($this->data)) {
                        return false; // end of input
                    }
                    // skip this token
                    continue;
                }
            } else {
                throw new Exception('Unexpected input at line' . $this->line .
                                    ': ' . $this->data[$this->counter]);
            }
            break;
        } while (true);

    } // end function


    const LITERAL = 3;

    function yy_r3_1($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LITERALSTART;
        $this->yypushstate(self::LITERAL);
    }

    function yy_r3_2($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LITERALEND;
        $this->yypopstate();
    }

    function yy_r3_3($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
    }

    function yy_r3_4($yy_subpatterns)
    {

        if (in_array($this->value, Array('<?', '<?=', '<?php'))) {
            $this->token = Smarty_Internal_Templateparser::TP_PHPSTARTTAG;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_FAKEPHPSTARTTAG;
            $this->value = substr($this->value, 0, 2);
        }
    }

    function yy_r3_5($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_PHPENDTAG;
    }

    function yy_r3_6($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
    }

    function yy_r3_7($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
    }

    function yy_r3_8($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LITERAL;
    }

    function yy_r3_11($yy_subpatterns)
    {

        $this->compiler->trigger_template_error("missing or misspelled literal closing tag");
    }


    function yylex4()
    {
        $tokenMap = array(
            1 => 0,
            2 => 1,
            4 => 0,
            5 => 0,
            6 => 0,
            7 => 0,
            8 => 0,
            9 => 0,
            10 => 0,
            11 => 0,
            12 => 0,
            13 => 3,
            17 => 0,
            18 => 0,
        );
        if ($this->counter >= strlen($this->data)) {
            return false; // end of input
        }
        $yy_global_pattern = "/^(" . $this->ldel . "\\s{1,}\/)|^(" . $this->ldel . "\\s*(if|elseif|else if|while)\\s+)|^(" . $this->ldel . "\\s*for\\s+)|^(" . $this->ldel . "\\s*foreach(?![^\s]))|^(" . $this->ldel . "\\s{1,})|^(" . $this->ldel . "\/)|^(" . $this->ldel . ")|^(\")|^(`\\$)|^(\\$[0-9]*[a-zA-Z_]\\w*)|^(\\$)|^(([^\"\\\\]*?)((?:\\\\.[^\"\\\\]*?)*?)(?=(" . $this->ldel . "|\\$|`\\$|\")))|^([\S\s]+)|^(.)/iS";

        do {
            if (preg_match($yy_global_pattern, substr($this->data, $this->counter), $yymatches)) {
                $yysubmatches = $yymatches;
                $yymatches = array_filter($yymatches, 'strlen'); // remove empty sub-patterns
                if (!count($yymatches)) {
                    throw new Exception('Error: lexing failed because a rule matched' .
                                        'an empty string.  Input "' . substr($this->data,
                                                                             $this->counter, 5) . '... state DOUBLEQUOTEDSTRING');
                }
                next($yymatches); // skip jGlobal match
                $this->token = key($yymatches); // token number
                if ($tokenMap[$this->token]) {
                    // extract sub-patterns for passing to lex function
                    $yysubmatches = array_slice($yysubmatches, $this->token + 1,
                                                $tokenMap[$this->token]);
                } else {
                    $yysubmatches = array();
                }
                $this->value = current($yymatches); // token value
                $r = $this->{
                'yy_r4_' . $this->token
                }($yysubmatches);
                if ($r === null) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    // accept this token
                    return true;
                } elseif ($r === true) {
                    // we have changed state
                    // process this token in the new state
                    return $this->yylex();
                } elseif ($r === false) {
                    $this->counter += strlen($this->value);
                    $this->line += substr_count($this->value, "\n");
                    if ($this->counter >= strlen($this->data)) {
                        return false; // end of input
                    }
                    // skip this token
                    continue;
                }
            } else {
                throw new Exception('Unexpected input at line' . $this->line .
                                    ': ' . $this->data[$this->counter]);
            }
            break;
        } while (true);

    } // end function


    const DOUBLEQUOTEDSTRING = 4;

    function yy_r4_1($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r4_2($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELIF;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r4_4($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELFOR;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r4_5($yy_subpatterns)
    {

        if ($this->smarty->auto_literal && trim(substr($this->value, $this->ldel_length, 1)) == '') {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDELFOREACH;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r4_6($yy_subpatterns)
    {

        if ($this->smarty->auto_literal) {
            $this->token = Smarty_Internal_Templateparser::TP_OTHER;
        } else {
            $this->token = Smarty_Internal_Templateparser::TP_LDEL;
            $this->yypushstate(self::SMARTY);
            $this->taglineno = $this->line;
        }
    }

    function yy_r4_7($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LDELSLASH;
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r4_8($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_LDEL;
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r4_9($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_QUOTE;
        $this->yypopstate();
    }

    function yy_r4_10($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_BACKTICK;
        $this->value = substr($this->value, 0, -1);
        $this->yypushstate(self::SMARTY);
        $this->taglineno = $this->line;
    }

    function yy_r4_11($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_DOLLARID;
    }

    function yy_r4_12($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

    function yy_r4_13($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

    function yy_r4_17($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

    function yy_r4_18($yy_subpatterns)
    {

        $this->token = Smarty_Internal_Templateparser::TP_OTHER;
    }

}

?>